/**
 *  运算符也叫操作符，通过运算符可以对一个或多个值进行运算，并获取运算结果。
 *  比如：typeof就是运算符，可以来获得一个值的类型，返回值是String类型的。
 *  它会将该值的类型以字符串的形式返回。
 *
 *  1. 算数运算符：
 *        当对非Number类型的值进行运算时，会将这些值转换为Number然后在运算
 *        任何值和NaN做运算都得NaN
 *        +
 *            如果对两个字符串进行加法运算，则会拼串。
 *            任何类型的值和字符串做加法运算，都会先转换为字符串，然后在和字符串做拼串操作。
 *        -
 *        *
 *        /
 *        %  取模运算（取余数）
 *
 *  2. 一元运算符：只需要一个操作数
 *        +（正号）
 *        -（负号）
 *        对于非Number类型的值，它会先转换为Number然后在运算。
 *        可以对其他的数据类型使用+，来将其转换为Number，它的原理和Number()函数一样
 *
 *  3. 自增和自减
 *          自增：通过自增可以使变量在自身的基础上增加1      ++
 *          对一个变量自增以后，原变量的值会立即自增1
 *          自增分为两种：后++（a++）和前++（++a），无论是a++还是++a，都会立即使原变量的值自增1，不同的是a++和++a的值不同。
 *          a++等于原变量的值（自增前的值）
 *          ++a等于原变量的新值（自增后的值）
 *
 *          自减：原理同自增
 *
 *  4. 逻辑运算符
 *      Js中为我们提供了三种运算符
 *      ! 非
 *          可以用来对一个值进行非运算
 *          如果对一个值进行两次取反，该值不会发生变化 !!a
 *          如果对非布尔值进行运算，则会将其转换为布尔值，然后在取反，所以我们可以利用该特点，来将一个其他的数据类型转换为布尔值。
 *          可以为一个任意数据类型取两次反，来将其转换为布尔值，原理和Boolean()函数一样。
 *      && 与
 *          可以对符号两侧的值进行与运算并返回计算结果
 *      || 或
 *          可以对符号两侧的值进行或运算并返回计算结果
 *      && || 非布尔值的情况
 *          对于非布尔值进行与或运算时会将其转换为布尔值，然后在进行运算。
 *
 *  5. 赋值运算符
 *      =
 *       可以将符号右侧的值赋值给符号左侧的变量
 *      +=
 *        a += 5  等价于 a = a + 5
 *      -=
 *        同+=
 *      *=
 *        同理
 *      /=
 *        同理
 *      %=
 *        同理
 *
 *  6. 关系运算符
 *      通过关系运算符可以比较两个值之间的大小关系，如果关系成立它会返回true，如果关系不成立则会返回false
 *      >
 *      >=
 *      <
 *      <=
 *      非数值的情况：
 *          对于非数值进行比较时，会将其转换为数字然后在比较
 *          任何值和NaN做任何比较结果都是false
 *          如果符号两侧的值都是字符串时，不会将其转换为数字进行比较，而会分别比较字符串中字符的Unicode编码
 *
 *  7. 相等运算符
 *      用来比较两个值是否相等，如果相等则返回true，否则返回false。
 *      使用 == 来做相等运算
 *      当使用 == 来比较两个值时，如果值的类型不同，则会自动进行类型转换，将其转换为相同的类型，然后在比较。
 *      undefined衍生自null，所以这两个值做相等判断时，会返回true
 *      NaN不和任何值相等，包括它本身。可以通过isNaN()函数来判断一个值是否是NaN，如果该值是NaN则返回true，否则返回false
 *
 *      不相等 !=
 *
 *      全等 ===
 *          用来判断两个值是否全等，它和相等类似，不同的是它不会做自动类型转换，如果两个值的类型不同直接返回false
 *
 *      不全等 !==
 *          用来判断两个值是否不全等，它和不相等类似，不同的是它不会做自动类型转换，如果两个值的类型不同则直接返回true
 *
 *   8. 条件运算符
 *          条件运算符也叫三元运算符
 *          语法：
 *              条件表达式:?语句1:语句2;
 *          执行流程：
 *              条件运算符在执行时，首先对条件表达式进行求值，如果该值为true，则执行语句1，并返回执行结果；如果该值为false，则执行语句2，并返回执行结果。
 *          如果条件表达式的求值结果是一个非布尔值，会将其转换为布尔值然后在运算。
 *
 *   9. 运算符的优先级
 *          先乘除，后加减，&&的优先级要高于||的优先级
 *          在Js中有一个运算符优先级的表，在表中越靠上优先级越高，优先级越高越先计算，如果优先级一样，则从左往右计算
 *          ()的优先级属于第二高的，一般情况下可以通过()来改变优先级
 * */
